Softmax

对输入数组沿指定维度进行 Softmax 计算,输出每个元素的概率值。

\[\text{output}_{i} = \frac{\exp(\text{input}_{i})}{\sum_j \exp(\text{input}_j)} \quad \text{for elements along the given axis}\]
输入:
  • input_ptr - 输入数据地址。

  • axis - 归一化的轴。

  • n_dim - 输入张量维度。

  • inner_size - 内部尺寸(轴之后的元素个数)。

  • outter_size - 外部尺寸(轴之前的元素个数)。

  • axis_size - 归一化轴的元素数量。

  • sum_data - 中间累加存储地址(用于存放指数和)。

  • core_mask - 核掩码(仅适用于共享存储版本)。

输出:
  • output_ptr - Softmax 计算结果地址。

支持平台:

FT78NE MT7004

备注

  • FT78NE 支持fp, int8

  • MT7004 支持hp, fp

共享存储版本:

void fp_softmax_s(float *input_ptr, float *output_ptr, float *sum_data, int axis, int n_dim, int inner_size, int outter_size, int axis_size, int core_mask)
void hp_softmax_s(half *input_ptr, half *output_ptr, half *sum_data, int axis, int n_dim, int inner_size, int outter_size, int axis_size, int core_mask)
void i8_softmax_s(int8_t *input_ptr, int8_t *output_ptr, float *sum_data, int axis, int n_dim, int inner_size, int outter_size, int axis_size, int core_mask)

C调用示例:

 1//FT78NE示例
 2#include <stdio.h>
 3#include <softmax.h>
 4
 5int main() {
 6    float *input = (float *)0xA0000000;   // input在DDR空间
 7    float *output = (float *)0xC0000000;
 8    float *sum_data = (float *)0xD0000000;
 9    int axis = 1;
10    int n_dim = 3;
11    int inner_size = 4;
12    int outter_size = 2;
13    int axis_size = 3;
14    int core_mask = 0xff;
15
16    fp_softmax_s(input, output, sum_data, axis, n_dim, inner_size, outter_size, axis_size, core_mask);
17    return 0;
18}

私有存储版本:

void fp_softmax_p(float *input_ptr, float *output_ptr, float *sum_data, int axis, int n_dim, int inner_size, int outter_size, int axis_size)
void hp_softmax_p(half *input_ptr, half *output_ptr, half *sum_data, int axis, int n_dim, int inner_size, int outter_size, int axis_size)
void i8_softmax_p(int8_t *input_ptr, int8_t *output_ptr, float *sum_data, int axis, int n_dim, int inner_size, int outter_size, int axis_size)

C调用示例:

 1//FT78NE示例
 2#include <stdio.h>
 3#include <softmax.h>
 4
 5int main() {
 6    float *input = (float *)0x10810000;   // input在L2空间
 7    float *output = (float *)0x10820000;
 8    float *sum_data = (float *)0x10830000;
 9    int axis = 1;
10    int n_dim = 3;
11    int inner_size = 4;
12    int outter_size = 2;
13    int axis_size = 3;
14
15    fp_softmax_p(input, output, sum_data, axis, n_dim, inner_size, outter_size, axis_size);
16    return 0;
17}